{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e9f663d1",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-14T03:06:52.794464Z",
     "start_time": "2024-05-14T03:06:51.446350Z"
    }
   },
   "outputs": [],
   "source": [
    "import gym\n",
    "import numpy as np\n",
    "from IPython import display\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "c4d75839",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-14T03:06:55.056388Z",
     "start_time": "2024-05-14T03:06:55.049344Z"
    }
   },
   "outputs": [],
   "source": [
    "class GymHelper:\n",
    "    def __init__(self,env,figsize=(3,3)):\n",
    "        self.env=env\n",
    "        self.figsize=figsize\n",
    "        plt.figure(figsize=figsize)\n",
    "        self.img=plt.imshow(env.render())\n",
    "    def render(self,title=None):\n",
    "        img_data=self.env.render()\n",
    "        self.img.set_data(img_data)\n",
    "        display.display(plt.gcf())\n",
    "        display.clear_output(wait=True)\n",
    "        if title:\n",
    "            plt.title(title)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "5e80df4a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-14T03:06:57.250746Z",
     "start_time": "2024-05-14T03:06:55.742101Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "import torch.nn.functional as F\n",
    "from tqdm import *\n",
    "import collections\n",
    "import time\n",
    "import random\n",
    "import sys\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ba10c218",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-14T02:44:04.102570Z",
     "start_time": "2024-05-14T02:44:04.087981Z"
    }
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "3d1f5ec6",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-14T03:07:02.028782Z",
     "start_time": "2024-05-14T03:06:59.109042Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 300x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "env=gym.make(\"Acrobot-v1\",render_mode=\"rgb_array\")\n",
    "env.reset()\n",
    "gym_helper=GymHelper(env)\n",
    "for i in range(20):\n",
    "    gym_helper.render(title=str(i))\n",
    "    action=env.action_space.sample()\n",
    "    observation,reward,terminated,truncated,info=env.step(action)\n",
    "    done=terminated or truncated\n",
    "    if done:break\n",
    "gym_helper.render(\"finish\")\n",
    "env.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e4d6e44b",
   "metadata": {},
   "source": [
    "## A2C"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "9d2975c9",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-14T03:07:02.973057Z",
     "start_time": "2024-05-14T03:07:02.965054Z"
    }
   },
   "outputs": [],
   "source": [
    "#定义a2c网络\n",
    "class AC(nn.Module):\n",
    "    def __init__(self,input_dim,output_dim):\n",
    "        super(AC,self).__init__()\n",
    "        #使用全连接层构建一个简单的神经网络，共享部分网络层\n",
    "        self.fc1=nn.Linear(input_dim,128)\n",
    "        self.fc2=nn.Linear(128,128)\n",
    "        #定义Actor与critic对应的全连接层\n",
    "        self.actor=nn.Linear(128,output_dim)\n",
    "        self.critic=nn.Linear(128,1)\n",
    "    def forward(self,x):\n",
    "        x=F.relu(self.fc1(x))\n",
    "        x=F.relu(self.fc2(x))\n",
    "        #得到概率分布\n",
    "        actor_output=F.softmax(self.actor(x),dim=1)\n",
    "        #critic网络输出,得到给定的价值估计\n",
    "        critic_output=self.critic(x)\n",
    "        return actor_output,critic_output"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "1d4c4dd0",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-14T03:07:04.777628Z",
     "start_time": "2024-05-14T03:07:04.764283Z"
    }
   },
   "outputs": [],
   "source": [
    "class A2C:\n",
    "    def __init__(self,env,lr=0.002,gamma=0.99):\n",
    "        self.env=env\n",
    "        self.gamma=gamma\n",
    "        #判断可用设备是GPU还是CPU\n",
    "        self.device=torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "        self.ac=AC(env.observation_space.shape[0],env.action_space.n).to(self.device)\n",
    "        self.optimizer=torch.optim.Adam(self.ac.parameters(),lr=lr)\n",
    "    def choose_action(self,state):\n",
    "        state=torch.FloatTensor(np.array([state])).to(self.device)\n",
    "        with torch.no_grad():\n",
    "            action_prob,_=self.ac(state)\n",
    "        c=torch.distributions.Categorical(action_prob)\n",
    "        action=c.sample()\n",
    "        return action.item()\n",
    "    def update(self,batch):\n",
    "        states,actions,rewards,next_states,dones=zip(*batch)\n",
    "        states=torch.FloatTensor(np.array(states)).to(self.device)\n",
    "        actions=torch.FloatTensor(np.array(actions)).view(-1,1).to(self.device)\n",
    "        rewards=torch.FloatTensor(np.array(rewards)).view(-1,1).to(self.device)\n",
    "        next_states=torch.FloatTensor(np.array(next_states)).to(self.device)\n",
    "        dones=torch.FloatTensor(np.array(dones)).view(-1,1).to(self.device)\n",
    "        #计算TD误差以及目标\n",
    "        action_prob,state_value=self.ac(states)\n",
    "        _,next_states=self.ac(next_states)\n",
    "        td_target=rewards+(1-dones)*self.gamma*next_states\n",
    "        td_delta=td_target-state_value\n",
    "        #计算策略下的动作概率\n",
    "        actions=actions.type(torch.long).to(self.device)\n",
    "        log_prob=torch.log(action_prob.gather(1,actions))\n",
    "        #计算actor与critic的loss\n",
    "        actor_loss=-(log_prob*td_delta.detach()).mean()\n",
    "        #计算价值损失\n",
    "        critic_loss=F.mse_loss(state_value,td_target).mean()\n",
    "        loss=actor_loss+critic_loss*0.5\n",
    "        #梯度清零,反向传播,参数更新\n",
    "        self.optimizer.zero_grad()\n",
    "        loss.backward()\n",
    "        self.optimizer.step()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "c69c81b0",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-14T03:10:05.886768Z",
     "start_time": "2024-05-14T03:07:05.386561Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  0%|                                                                                 | 1/1500 [00:02<57:06,  2.29s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode0:-500.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  3%|██▏                                                                             | 41/1500 [00:23<12:48,  1.90it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode40:-500.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  5%|████▎                                                                           | 82/1500 [00:38<04:24,  5.35it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode80:-145.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  8%|██████▍                                                                        | 122/1500 [00:43<03:03,  7.51it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode120:-111.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 11%|████████▌                                                                      | 163/1500 [00:48<02:13,  9.99it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode160:-108.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 13%|██████████▋                                                                    | 202/1500 [00:52<02:11,  9.87it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode200:-86.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 16%|████████████▊                                                                  | 243/1500 [00:56<02:18,  9.10it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode240:-192.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 19%|██████████████▊                                                                | 282/1500 [00:59<01:51, 10.96it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode280:-77.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 21%|████████████████▉                                                              | 322/1500 [01:03<01:55, 10.21it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode320:-91.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 24%|███████████████████                                                            | 362/1500 [01:07<02:08,  8.83it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode360:-190.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 27%|█████████████████████▏                                                         | 403/1500 [01:11<01:36, 11.39it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode400:-72.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 30%|███████████████████████▎                                                       | 443/1500 [01:15<01:40, 10.49it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode440:-101.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 32%|█████████████████████████▎                                                     | 481/1500 [01:18<01:33, 10.84it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode480:-93.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 35%|███████████████████████████▌                                                   | 523/1500 [01:22<01:29, 10.89it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode520:-83.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 38%|█████████████████████████████▋                                                 | 563/1500 [01:26<01:28, 10.55it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode560:-106.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 40%|███████████████████████████████▋                                               | 602/1500 [01:31<01:26, 10.34it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode600:-79.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 43%|█████████████████████████████████▊                                             | 642/1500 [01:35<01:26,  9.94it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode640:-97.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 45%|███████████████████████████████████▉                                           | 682/1500 [01:38<01:20, 10.19it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode680:-149.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 48%|██████████████████████████████████████                                         | 723/1500 [01:42<01:08, 11.33it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode720:-76.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 51%|████████████████████████████████████████▏                                      | 762/1500 [01:46<01:08, 10.81it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode760:-76.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 53%|██████████████████████████████████████████▏                                    | 802/1500 [01:50<01:06, 10.42it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode800:-92.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 56%|████████████████████████████████████████████▎                                  | 842/1500 [01:54<01:01, 10.71it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode840:-77.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 59%|██████████████████████████████████████████████▌                                | 883/1500 [01:58<00:57, 10.65it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode880:-82.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 61%|████████████████████████████████████████████████▌                              | 921/1500 [02:02<00:54, 10.53it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode920:-85.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 64%|██████████████████████████████████████████████████▋                            | 962/1500 [02:06<00:55,  9.66it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode960:-123.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 67%|████████████████████████████████████████████████████                          | 1002/1500 [02:10<00:50,  9.78it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode1000:-77.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 69%|██████████████████████████████████████████████████████▏                       | 1042/1500 [02:15<00:46,  9.82it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode1040:-91.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 72%|████████████████████████████████████████████████████████▎                     | 1082/1500 [02:18<00:38, 10.86it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode1080:-76.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 75%|██████████████████████████████████████████████████████████▎                   | 1122/1500 [02:22<00:34, 11.04it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode1120:-77.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 77%|████████████████████████████████████████████████████████████▍                 | 1162/1500 [02:26<00:32, 10.41it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode1160:-83.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 80%|██████████████████████████████████████████████████████████████▌               | 1202/1500 [02:30<00:27, 10.91it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode1200:-70.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 83%|████████████████████████████████████████████████████████████████▌             | 1242/1500 [02:34<00:24, 10.35it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode1240:-87.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 85%|██████████████████████████████████████████████████████████████████▋           | 1282/1500 [02:38<00:20, 10.69it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode1280:-77.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 88%|████████████████████████████████████████████████████████████████████▊         | 1323/1500 [02:42<00:20,  8.83it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode1320:-80.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 91%|██████████████████████████████████████████████████████████████████████▊       | 1362/1500 [02:46<00:13, 10.37it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode1360:-85.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 93%|████████████████████████████████████████████████████████████████████████▉     | 1402/1500 [02:50<00:09, 10.71it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode1400:-87.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 96%|███████████████████████████████████████████████████████████████████████████   | 1443/1500 [02:54<00:05, 10.09it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode1440:-103.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 99%|█████████████████████████████████████████████████████████████████████████████ | 1481/1500 [02:57<00:01, 10.70it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode1480:-79.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [03:00<00:00,  8.32it/s]\n"
     ]
    }
   ],
   "source": [
    "max_episodes=1500\n",
    "max_steps=1000\n",
    "#batch_size=32\n",
    "\n",
    "agent=A2C(env)\n",
    "eps_rewards=[]\n",
    "\n",
    "for episode in tqdm(range(max_episodes)):\n",
    "    state,_=env.reset()\n",
    "    eps_reward=0\n",
    "    buffer=[]\n",
    "    for step in range(max_steps):\n",
    "        action=agent.choose_action(state)\n",
    "        next_state,reward,terminated,truncated,info=env.step(action)\n",
    "        done=terminated or truncated\n",
    "        buffer.append((state,action,reward,next_state,done))\n",
    "        eps_reward+=reward\n",
    "#         if len(agent.replay_buffer)>batch_size:\n",
    "#             agent.update(batch_size)\n",
    "        state=next_state\n",
    "        if done:\n",
    "            break\n",
    "    agent.update(buffer)\n",
    "    eps_rewards.append(eps_reward)\n",
    "    if episode % 40==0:\n",
    "        tqdm.write(\"Episode\"+str(episode)+\":\"+str(eps_reward))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "e2f3877f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-14T03:10:18.070167Z",
     "start_time": "2024-05-14T03:10:17.911703Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1ad73c5a3e0>]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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jIwMJCQk4IorrsCOHTsUy1RWVuKPf/wj0tLSkJiYiDFjxuDgwYOB3BWfzJo1CzabDffff7/ztXDc30OHDuHWW29Fs2bN0KhRI1x00UXYuHGj8/1w2ueamho88cQT6NChAxISEtCxY0fMmDEDdXV1zmVCeX9XrFiB0aNHIyMjAzabDf/5z38U75u1b6WlpZgwYQJSUlKQkpKCCRMm4OTJkxbvnTtP+1tdXY1HHnkEPXv2RGJiIjIyMnDbbbehuLhYsY5w2V9Xd999N2w2G1577TXF66G0v6aRyCcfffSRFBsbK73zzjvSzp07palTp0qJiYnSgQMHgl00Q0aMGCG999570vbt26WCggJp1KhRUtu2baXTp087l3nhhRekpKQkaeHChdK2bdukm2++WWrVqpVUXl7uXOaee+6RWrduLS1ZskTatGmTNGTIEKl3795STU1NMHZLl3Xr1knt27eXevXqJU2dOtX5erjt76+//iq1a9dOys3NldauXSvt27dPWrp0qbR3717nMuG0z88995zUrFkzafHixdK+ffukjz/+WGrcuLH02muvOZcJ5f396quvpMcff1xauHChBEBatGiR4n2z9m3kyJFSVlaWtGrVKmnVqlVSVlaWdO211wZqN5087e/JkyeloUOHSvPnz5d++uknafXq1VK/fv2k7OxsxTrCZX/lFi1aJPXu3VvKyMiQXn31VcV7obS/ZmEw46NLL71UuueeexSvdevWTXr00UeDVCJzHD16VAIgff/995IkSVJdXZ2Unp4uvfDCC85lKioqpJSUFOlvf/ubJEn1F5TY2Fjpo48+ci5z6NAhKSoqSvrmm28CuwM6nTp1SurSpYu0ZMkSKScnxxnMhOP+PvLII9LgwYM13w+3fR41apR0xx13KF67/vrrpVtvvVWSpPDaX9ebnVn7tnPnTgmAtGbNGucyq1evlgBIP/30k8V7pc3Tzd1h3bp1EgDng2U47u/Bgwel1q1bS9u3b5fatWunCGZCeX/9wWYmH1RVVWHjxo0YPny44vXhw4dj1apVQSqVOcrKygAATZs2BQDs27cPJSUlin212+3Iyclx7uvGjRtRXV2tWCYjIwNZWVnCHo/77rsPo0aNwtChQxWvh+P+fv755+jbty9uvPFGtGjRAn369ME777zjfD/c9nnw4MFYtmwZdu/eDQDYsmULVq5ciWuuuQZA+O2vnFn7tnr1aqSkpKBfv37OZfr374+UlBSh9x+ov4bZbDY0adIEQPjtb11dHSZMmICHHnoIPXr0cHs/3PZXr4iYaNJsx48fR21tLVq2bKl4vWXLligpKQlSqfwnSRLy8vIwePBgZGVlAYBzf9T29cCBA85l4uLikJqa6raMiMfjo48+wqZNm7B+/Xq398Jxf3/55Re89dZbyMvLw2OPPYZ169ZhypQpsNvtuO2228Junx955BGUlZWhW7duiI6ORm1tLWbOnIlbbrkFQHh+xg5m7VtJSQlatGjhtv4WLVoIvf8VFRV49NFHMW7cOOcki+G2vy+++CJiYmIwZcoU1ffDbX/1YjDjB5vNpvhdkiS310LJ5MmTsXXrVqxcudLtPV/2VcTjUVRUhKlTpyI/Px/x8fGay4XL/gL1T3J9+/bF888/DwDo06cPduzYgbfeegu33Xabc7lw2ef58+fjww8/xL/+9S/06NEDBQUFuP/++5GRkYGJEyc6lwuX/VVjxr6pLS/y/ldXV2Ps2LGoq6vDm2++6XX5UNzfjRs34s9//jM2bdpkuFyhuL9GsJnJB2lpaYiOjnaLYI8ePer2RBQq/vjHP+Lzzz/H8uXL0aZNG+fr6enpAOBxX9PT01FVVYXS0lLNZUSxceNGHD16FNnZ2YiJiUFMTAy+//57vP7664iJiXGWN1z2FwBatWqF7t27K1678MILUVhYCCD8PuOHHnoIjz76KMaOHYuePXtiwoQJeOCBBzBr1iwA4be/cmbtW3p6Oo4cOeK2/mPHjgm5/9XV1bjpppuwb98+LFmyxFkrA4TX/v7www84evQo2rZt67x+HThwANOmTUP79u0BhNf+GsFgxgdxcXHIzs7GkiVLFK8vWbIEAwcODFKpfCNJEiZPnoxPP/0U3377LTp06KB4v0OHDkhPT1fsa1VVFb7//nvnvmZnZyM2NlaxzOHDh7F9+3bhjsdVV12Fbdu2oaCgwPmvb9++GD9+PAoKCtCxY8ew2l8AGDRokFt3+927d6Ndu3YAwu8zPnv2LKKilJe26OhoZ9fscNtfObP2bcCAASgrK8O6deucy6xduxZlZWXC7b8jkNmzZw+WLl2KZs2aKd4Pp/2dMGECtm7dqrh+ZWRk4KGHHsJ///tfAOG1v4YEOuM4XDi6Zr/77rvSzp07pfvvv19KTEyU9u/fH+yiGfKHP/xBSklJkb777jvp8OHDzn9nz551LvPCCy9IKSkp0qeffipt27ZNuuWWW1S7erZp00ZaunSptGnTJunKK68UohurHvLeTJIUfvu7bt06KSYmRpo5c6a0Z88ead68eVKjRo2kDz/80LlMOO3zxIkTpdatWzu7Zn/66adSWlqa9PDDDzuXCeX9PXXqlLR582Zp8+bNEgBpzpw50ubNm529d8zat5EjR0q9evWSVq9eLa1evVrq2bNnULruetrf6upqacyYMVKbNm2kgoICxTWssrIy7PZXjWtvJkkKrf01C4MZP/z1r3+V2rVrJ8XFxUkXX3yxsztzKAGg+u+9995zLlNXVyc99dRTUnp6umS326XLL79c2rZtm2I9586dkyZPniw1bdpUSkhIkK699lqpsLAwwHvjG9dgJhz394svvpCysrIku90udevWTXr77bcV74fTPpeXl0tTp06V2rZtK8XHx0sdO3aUHn/8ccXNLZT3d/ny5arf2YkTJ0qSZN6+nThxQho/fryUlJQkJSUlSePHj5dKS0sDtJcNPO3vvn37NK9hy5cvd64jXPZXjVowE0r7axabJElSIGqAiIiIiKzAnBkiIiIKaQxmiIiIKKQxmCEiIqKQxmCGiIiIQhqDGSIiIgppDGaIiIgopDGYISIiopDGYIaIiIhCGoMZIiIiCmkMZoiIiCikMZghIiKikMZghoiIiELa/wMOI2tLi8bztwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(eps_rewards)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "a1a9b5e0",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-14T03:15:38.894929Z",
     "start_time": "2024-05-14T03:10:21.282640Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 300x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "observation,_=env.reset()\n",
    "gym_helper=GymHelper(env,figsize=(3,3))\n",
    "agent=A2C(env)\n",
    "i=0\n",
    "while 1:\n",
    "    gym_helper.render(title=str(i))\n",
    "    action=agent.choose_action(observation)\n",
    "    observation,reward,terminated,truncated,info=env.step(action)\n",
    "    done=terminated or truncated\n",
    "    i+=1\n",
    "    time.sleep(0.5)\n",
    "    if done:\n",
    "        break\n",
    "gym_helper.render(title=\"finished\")\n",
    "env.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "23e899a1",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
